RE: Perl TCP
2023-10-19 by: don@coastlandtech.co
From: don@coastlandtech.com
------------------------------------------------------
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
use IO::Select;
# Create a listening socket
my $server =3D IO::Socket::INET->new(
LocalPort =3D> 12345,
Type =3D> SOCK_STREAM,
Reuse =3D> 1,
Listen =3D> 5
) or die "Cannot create socket: $!";
print "Server listening on port 12345...\n";
# Use IO::Select to handle multiple connections
my $selector =3D IO::Select->new($server);
while (1) {
# Check sockets ready for reading
my @ready =3D $selector->can_read;
=20
foreach my $socket (@ready) {
# If the socket is the server socket, accept the new connection
if ($socket =3D=3D $server) {
my $new_socket =3D $server->accept;
$selector->add($new_socket);
} else {
# Read data from the socket
my $data;
$socket->recv($data, 1024);
=20
# Remove connection if it's closed or empty
unless ($data) {
$selector->remove($socket);
next;
}
=20
# Respond based on received data
my $response =3D get_response($data);
$socket->send($response);
=20
# Close the socket
$selector->remove($socket);
$socket->close;
}
}
}
sub get_response {
my $input =3D shift;
=20
if ($input =3D~ /^1\s*$/) {
return "2";
} elsif ($input =3D~ /^2\s*$/) {
return "5";
} else {
return "Invalid input";
}
}
Maybe start here ... =F0=9F=98=8A=20
-----Original Message-----
From: Unkmar =20
Sent: Wednesday, October 18, 2023 8:05 PM
To: don@coastlandtech.com
Subject: [chugalug] Perl TCP
I want to ask for help. Because that is the working smarter not harder.
I don't want to ask for help. Because I don't want to be a bother to =
someone that doesn't just inherently know how to do it with almost no =
effort. I mean, I can figure it out without help. It will just likely =
take me a few hours (6+), while someone that "knows" can likely whip a =
sample up in 30 minutes to an 1 hour.
The task is a Perl TCP listener (server), that can dynamically respond =
to the input.
Overly simple example. If it gets "1" it can respond with "2". If it =
gets "2" it responds with "5". The data transfer in or out will be less =
than 1Kb, less than 1024 bytes.
I need it to capable of async or non-blocking. So that a connection =
remaining open doesn't prevent second connection from succeeding. I also =
prefer all the code to be in a single file, and that is only because I =
believe it should be less than 200 lines. Probably around
100 lines or less.
Meanwhile, I will go back to other things for now. And later begin =
burning a few hours trying to cobble something together.
-- Lucius L. Hilley III